/*
 * SpriteRenderer.h
 *
 *  Created on: 2011/08/09
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_SCENE_SPRITERENDERER_H
#define INCLUDED_NTENGINE_SCENE_SPRITERENDERER_H

#include "NTEngine/Graphics/Texture.h"

namespace NTEngine {
namespace Math {
class Vector2;
class Rectangle;
class Color;
} // namespace Math
namespace Scene {

/**
 * @brief 2Dスプライト描画ヘルパーです。
 *
 */
class SpriteRenderer {
public:
	/**
	 * @brief オブジェクト生成
	 */
	static SpriteRenderer create( int bufferSize );

	/**
	 * @brief スプライトバッファへ描画追加します
	 */
	void add( Graphics::Texture texture, int x, int y, float depth = 0.F );

	/**
	 * @brief スプライトバッファへ描画追加します
	 */
	void add(
		Graphics::Texture texture,
		const Math::Vector2& position,
		const Math::Rectangle& source,
		const Math::Color& color,
		float depth = 0.F );

	/**
	 * @brief スプライトバッファへ描画追加します
	 */
	void add(
		Graphics::Texture texture,
		const Math::Vector2& position,
		const Math::Rectangle& source,
		const Math::Color& color,
		const Math::Vector2& scale,
		float depth = 0.F );

	/**
	 * @brief スプライトバッファに描画追加します
	 */
	void add(
		Graphics::Texture texture,
		const Math::Vector2& position,
		const Math::Rectangle& source,
		const Math::Color& color,
		const Math::Vector2& origin,
		float angle,
		float depth,
		const Math::Vector2& scale );

	/**
	 * @brief バッファにたまったものをまとめて描画します
	 */
	void draw();

	/**
	 * @brief 現在のオブジェクト数を取得
	 */
	int size() const;

	/**
	 * @brief バッファキャパシティ取得
	 */
	int capacity() const;

	// 非公開
	SpriteRenderer();
	~SpriteRenderer();
	SpriteRenderer( const SpriteRenderer& );
	void release();
	SpriteRenderer& operator=( const SpriteRenderer& );
	bool operator==( const SpriteRenderer& ) const;
	bool operator!=( const SpriteRenderer& ) const;
	int referenceCount() const;
	operator void*() const;
private:
	class Impl;
	Impl* mImpl;
};

} // namespace Scene
} // namespace NTEngine

#endif // INCLUDED_NTENGINE_SCENE_SPRITERENDERER_H
